//package com.ccp.dev.form.configuration;
//
//import com.alibaba.druid.pool.DruidDataSource;
//import com.ccp.dev.core.basic.mybatis.OffsetLimitInterceptor;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionFactoryBean;
//import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.jdbc.datasource.DataSourceTransactionManager;
//import javax.sql.DataSource;
//import java.sql.SQLException;
//import java.util.Properties;
//
///**
// * 数据源配置类
// *
// * @author zhaowj
// */
//
//@Configuration
//@ConfigurationProperties(prefix = "spring.datasource")
//@Import({OffsetLimitInterceptor.class})
//public class DataSourceConfiguration {
//
//    /**
//     * dao层的包路径
//     */
//    static final String PACKAGE = "com.ccp.dev.form.dao";
//
//    /**
//     * mapper文件的相对路径
//     */
//    private static final String MAPPER_LOCATION = "classpath*:mapper/*.xml";
//
//    private String type;
//    private String filters;
//    private String url;
//    private String username;
//    private String password;
//    private String name;
//    private int maxOpenPreparedStatements;
//    private String driverClassName;
//    private int initialSize;
//    private int minIdle;
//    private int maxActive;
//    private long maxWait;
//    private boolean testWhileIdle;
//    private boolean testOnBorrow;
//    private boolean testOnReturn;
//    private long timeBetweenEvictionRunsMillis;
//    private long minEvictableIdleTimeMillis;
//    private String validationQuery;
//    private boolean poolPreparedStatements;
//
//    @Value("${mybatis.configuration-properties.blobType}")
//    private String blobType;
//    @Value("${mybatis.configuration-properties.boolValue}")
//    private String boolValue;
//    @Value("${mybatis.configuration-properties.clobType:CLOB}")
//    private String clobType;
//    @Value("${mybatis.configuration.database-id}")
//    private String DBID;
//
//
//    @Bean(name = "dataSource_Default")
//    public DataSource primaryDataSource() throws SQLException {
//        DruidDataSource druid = new DruidDataSource();
//        // 监控统计拦截的filters
//        druid.setFilters(filters);
//
//        // 配置基本属性
//        druid.setDriverClassName(driverClassName);
//        druid.setUsername(username);
//        druid.setPassword(password);
//        druid.setUrl(url);
//
//        //初始化时建立物理连接的个数
//        druid.setInitialSize(initialSize);
//        //最大连接池数量
//        druid.setMaxActive(maxActive);
//        //最小连接池数量
//        druid.setMinIdle(minIdle);
//        //获取连接时最大等待时间，单位毫秒。
//        druid.setMaxWait(maxWait);
//        //间隔多久进行一次检测，检测需要关闭的空闲连接
//        druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//        //一个连接在池中最小生存的时间
//        druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//        //用来检测连接是否有效的sql
//        druid.setValidationQuery(validationQuery);
//        //建议配置为true，不影响性能，并且保证安全性。
//        druid.setTestWhileIdle(testWhileIdle);
//        //申请连接时执行validationQuery检测连接是否有效
//        druid.setTestOnBorrow(testOnBorrow);
//        druid.setTestOnReturn(testOnReturn);
//        //是否缓存preparedStatement，也就是PSCache，oracle设为true，mysql设为false。分库分表较多推荐设置为false
//        druid.setPoolPreparedStatements(poolPreparedStatements);
//        return druid;
//    }
//
//    @Autowired
//    private OffsetLimitInterceptor offsetLimitInterceptor;
//
//    @Bean(name = "sqlSessionFactory")
//    public SqlSessionFactory backSqlSessionFactory(@Qualifier("dataSource_Default") DataSource dataSource) throws Exception {
//        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
//        sessionFactory.setDataSource(dataSource);
//        Properties configurationProperties = new Properties();
//        configurationProperties.setProperty("blobType",blobType);
//        configurationProperties.setProperty("boolValue",boolValue);
//        configurationProperties.setProperty("clobType",clobType);
//        sessionFactory.setConfigurationProperties(configurationProperties);
//        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
//                .getResources(DataSourceConfiguration.MAPPER_LOCATION));
//        sessionFactory.setTypeAliasesPackage("com.ccp.dev.form.model");
//        sessionFactory.setPlugins(new Interceptor[]{offsetLimitInterceptor});
//
//        org.apache.ibatis.session.Configuration mybatisConf = new org.apache.ibatis.session.Configuration();
//        mybatisConf.setDatabaseId(DBID);
//        sessionFactory.setConfiguration(mybatisConf);
//        return sessionFactory.getObject();
//    }
//
//    @Bean(name = "transactionManager")
//    public DataSourceTransactionManager transactionManager() throws SQLException {
//        return new DataSourceTransactionManager(primaryDataSource());
//    }
//
//    public String getType() {
//        return type;
//    }
//
//    public void setType(String type) {
//        this.type = type;
//    }
//
//    public String getFilters() {
//        return filters;
//    }
//
//    public void setFilters(String filters) {
//        this.filters = filters;
//    }
//
//    public String getUrl() {
//        return url;
//    }
//
//    public void setUrl(String url) {
//        this.url = url;
//    }
//
//    public String getUsername() {
//        return username;
//    }
//
//    public void setUsername(String username) {
//        this.username = username;
//    }
//
//    public String getPassword() {
//        return password;
//    }
//
//    public void setPassword(String password) {
//        this.password = password;
//    }
//
//    public String getName() {
//        return name;
//    }
//
//    public void setName(String name) {
//        this.name = name;
//    }
//
//    public int getMaxOpenPreparedStatements() {
//        return maxOpenPreparedStatements;
//    }
//
//    public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) {
//        this.maxOpenPreparedStatements = maxOpenPreparedStatements;
//    }
//
//    public String getDriverClassName() {
//        return driverClassName;
//    }
//
//    public void setDriverClassName(String driverClassName) {
//        this.driverClassName = driverClassName;
//    }
//
//    public int getInitialSize() {
//        return initialSize;
//    }
//
//    public void setInitialSize(int initialSize) {
//        this.initialSize = initialSize;
//    }
//
//    public int getMinIdle() {
//        return minIdle;
//    }
//
//    public void setMinIdle(int minIdle) {
//        this.minIdle = minIdle;
//    }
//
//    public int getMaxActive() {
//        return maxActive;
//    }
//
//    public void setMaxActive(int maxActive) {
//        this.maxActive = maxActive;
//    }
//
//    public long getMaxWait() {
//        return maxWait;
//    }
//
//    public void setMaxWait(long maxWait) {
//        this.maxWait = maxWait;
//    }
//
//    public boolean isTestWhileIdle() {
//        return testWhileIdle;
//    }
//
//    public void setTestWhileIdle(boolean testWhileIdle) {
//        this.testWhileIdle = testWhileIdle;
//    }
//
//    public boolean isTestOnBorrow() {
//        return testOnBorrow;
//    }
//
//    public void setTestOnBorrow(boolean testOnBorrow) {
//        this.testOnBorrow = testOnBorrow;
//    }
//
//    public boolean isTestOnReturn() {
//        return testOnReturn;
//    }
//
//    public void setTestOnReturn(boolean testOnReturn) {
//        this.testOnReturn = testOnReturn;
//    }
//
//    public long getTimeBetweenEvictionRunsMillis() {
//        return timeBetweenEvictionRunsMillis;
//    }
//
//    public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
//        this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
//    }
//
//    public long getMinEvictableIdleTimeMillis() {
//        return minEvictableIdleTimeMillis;
//    }
//
//    public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
//        this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
//    }
//
//    public String getValidationQuery() {
//        return validationQuery;
//    }
//
//    public void setValidationQuery(String validationQuery) {
//        this.validationQuery = validationQuery;
//    }
//
//    public boolean isPoolPreparedStatements() {
//        return poolPreparedStatements;
//    }
//
//    public void setPoolPreparedStatements(boolean poolPreparedStatements) {
//        this.poolPreparedStatements = poolPreparedStatements;
//    }
//
//    public OffsetLimitInterceptor getOffsetLimitInterceptor() {
//        return offsetLimitInterceptor;
//    }
//
//    public void setOffsetLimitInterceptor(OffsetLimitInterceptor offsetLimitInterceptor) {
//        this.offsetLimitInterceptor = offsetLimitInterceptor;
//    }
//}
